home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 10
/
FM Towns Free Software Collection 10.iso
/
tos_updt
/
fmcity
/
palcom
/
auto
/
script
/
bbscom.mx
< prev
next >
Wrap
Text File
|
1995-04-11
|
21KB
|
743 lines
//--------------------------------------------------------------------------//
// PALCOM V2.1 L10 //
// 自動通信:掲示板巡回スクリプト //
// //
// CopyRight(C) 1994/10/20 //
// FUJITSU PERSONAL COMPUTER SYSTEMS LIMITED //
// written by C-cube Soft T.Nakamura //
//--------------------------------------------------------------------------//
event @OPEN.EXTERN {
$$USER.DEFINED.9 = #FALSE;
$TrdId = AUTO.getTrdId();
$LogId = AUTO.getLogFileId();
$dayList = time.getDate();
$ToDay1 = str.join([data.toString2( list.getNth( $dayList, 2 ),2," ",0),
data.toString2( list.getNth( $dayList, 3 ),2,"0",0)],
"/" );
$ToDay2 = str.join([data.toString2( list.getNth( $dayList, 1 ),2,"0",0),
data.toString2( list.getNth( $dayList, 2 ),2,"0",0),
data.toString2( list.getNth( $dayList, 3 ),2,"0",0)],
"" );
sys.global( $TrdId );
sys.global( $LogId );
sys.global( $ToDay1 );
sys.global( $ToDay2 );
$ret = trd.checkList( $TrdId, [1,4,-2] );
if( list.get1st( $ret ) == 0 ) {
//--- 掲示板のグループが無いので初回アクセスとみなす ---//
NEWMAKE:xfer.pauseText( $LogId );
trd.setData( $TrdId, [1,5],"1" );
$ret = Auto.makeBbsNew();
if( list.get1st( trd.checkList( $TrdId, [1,5] )) != 0 ) {
trd.delData( $TrdId, [1,5] );
}
xfer.resumeText( $LogId );
$$USER.DEFINED.9 = $ret;
return;
}
//--- データベースファイルとの連携を取る ---//
$ret = Auto.connectBbsData( AUTO.getBbsData(), [1,4] );
if( $ret == #FALSE ) {
goto NEWMAKE;
}
$dataList = list.getNth( $ret, 2 );
//--- 掲示板を巡回する必要があるかどうかチェック ---//
$setDataList = AUTO.getSetData();
$topList = list.getNth( $setDataList, 1 );
$upList = AUTO.getUpList( 14 );
$dwFlg = list.getNth( list.getNth( $topList, 5 ), 1 );
$upFlg = list.getNth( list.getNth( $topList, 5 ), 2 );
$st = 0;
$retInf = #TRUE;
if(( $dwFlg == #TRUE )&&( list.get1st( $ret ) == #TRUE )) {
$st = 1;
}
if(( $upFlg == #TRUE )&&( list.size( $upList ) != 0 )) {
$st = $st | 2;
}
if( list.get1st( trd.checkList( $TrdId, [1,5] )) != 0 ) {
trd.delData( $TrdId, [1,5] );
AUTO.setTrdUpdateFlg();
$st = $st | 4;
}
if( $st != 0 ) {
//--- 掲示板巡回制御 ---//
sys.stopIntRec();
$retInf = Auto.bbsCom("GO BBS\r","",$dataList, [1,4], 0, $st, $upList);
sys.startIntRec();
}
$$USER.DEFINED.9 = $retInf;
return;
}
event @CLOSE.EXTERN {
sys.local( $TrdId );
sys.local( $LogId );
sys.local( $ToDay1 );
sys.local( $ToDay2 );
sys.startIntRec();
return;
}
event @ERROR {
sys.startIntRec();
AUTO.fatalError();
event.mainLoop();
}
//--------------------------//
//--- 掲示板巡回制御 ---//
//--------------------------//
function Auto.bbsCom( $cmd,$title,$dataList,$tag,$mode,$status,$upList ) {
$AUTO.WAIT15 = AUTO.getWaitChar( 15 );
$AUTO.WAIT60 = AUTO.getWaitChar( 60 );
AUTO.putStr2( $cmd );
$ret = Auto.getBbsMenu( $mode );
if( $mode == 0 ) {
if( $ret == #FALSE ) {
//--- 掲示板に入れなかった ---//
return( #FALSE );
}
}
$titleList = list.getNth( $ret, 1 );
$noList = list.getNth( $ret, 2 );
if( $mode == 0 ) {
AUTO.sendCommand("SET LINE 10");
AUTO.sendCommand("SET MENU OFF");
AUTO.sendCommand("SET PAGE OFF");
}
if( list.size( $titleList ) == 0 ) {
//--- サブメニューが無くなってしまった ---//
$errMsg = ["メニューの構成が設定と相違しています。",
"巡回を中断しました。",
"データベースファイルを更新しました。",
str.join(["掲示板名:", $title], "" )];
AUTO.error( "掲示板巡回", $errMsg );
$tagSub = list.putLast( data.copy( $tag ), -2 );
if( trd.count( $TrdId, $tagSub ) != 0 ) {
trd.delData( $TrdId, $tagSub );
}
trd.setData( $TrdId, $tag, $title );
AUTO.setTrdUpdateFlg();
return;
}
//--- タイトルリストに相違がないかどうかチェック ---//
$updateFlg = 0;
$chkList = [];
foreach( $a, $titleList ) {
list.putLast( $chkList, 0 );
}
foreach( $a, $dataList ) {
if( data.getType( list.get1st( $a )) != #NUMBER ) {
continue;
}
$i = 1;
$str = list.getNth( $a, 2 );
foreach( $b, $titleList ) {
if( $b == $str ) {
list.put1st( $a, list.getNth( $noList, $i ));
list.put1st( $a, #FALSE );
list.delNth( $chkList, $i );
list.putNth( $chkList, $i - 1, 1 );
exit;
}
$i = $i + 1;
}
}
//--- 掲示板の中に入る ---//
$flg = 0;
foreach( $a, $dataList ) {
if( data.getType( list.getNth( $a, 1 )) != #CONST ) {
//--- メニュー構成と相違のあるデータ ---//
continue;
}
$bbsNo = list.getNth( $a, 2 );
if( data.getType( list.getNth( $a, 3 )) != #NUMBER ) {
//--- データベースの構成と相違のあるデータ ---//
continue;
}
$tagSub = list.putLast( data.copy( $tag ), list.getNth( $a, 3 ));
$titleSub = list.getNth( $a, 4 );
$upListSub = AUTO.selectUpList( $upList,$mode + 3,list.getNth($a, 3));
if( data.getType( list.getNth( $a, 6 )) == #LIST ) {
//--- サブメニューが存在する ---//
//--- サブメニューを巡回する必要があるかどうかチェック ---//
$statusSub = 0;
if(( $status & 1 )&&( list.getNth( $a, 5 ) == #TRUE )) {
$statusSub = 1;
}
if(( $status & 2 )&&( list.size( $upListSub ) != 0 )) {
$statusSub = $statusSub | 2;
}
if( $statusSub != 0 ) {
$ret = Auto.bbsCom( $bbsNo, $titleSub, list.getNth( $a, 6 ),
$tagSub, $mode + 1, $statusSub, $upListSub );
if( $ret == #FALSE ) {
return( #FALSE );
}
AUTO.sendCommand("E");
}
continue;
}
//--- 掲示板に入る必要があるかどうかチェック ---//
$statusSub = 0;
if(( $status & 1 )&&( list.getNth( $a, 5 ) == #TRUE )) {
$statusSub = 1;
}
if(( $status & 2 )&&( list.size( $upListSub ) != 0 )) {
$statusSub = $statusSub | 2;
}
if( $statusSub == 0 ) {
//--- 入る必要無し ---//
continue;
}
//--- 掲示板に入る ---//
$srhId = list.getNth( $a, 6 );
$day1 = list.getNth( $a, 7 );
$srhKey = list.getNth( $a, 8 );
AUTO.putStr2( $bbsNo );
$ret = Auto.getBbsMenu( 1 );
if( $ret == #FALSE ) {
//--- 掲示板に入れなかった ---//
return( #FALSE );
}
if( list.size( list.get1st( $ret )) != 0 ) {
//--- なぜかサブメニューが存在する ---//
$errMsg = ["掲示板のメニューの構成が相違しています。",
"巡回を中断しました。",
"データベースファイルを更新しました。",
str.join(["掲示板名:", $titleSub], "" )];
AUTO.error( "掲示板巡回", $errMsg );
AUTO.sendCommand("E");
if( trd.count( $TrdId, $tagSub ) != 0 ) {
trd.delData( $TrdId, $tagSub );
}
if( Auto.makeBbsDataForDB( $bbsNo, $titleSub, $tagSub ) == #FALSE){
return( #FALSE );
}
AUTO.setTrdUpdateFlg();
continue;
}
//--- やっと本処理 ---//
if( $statusSub & 2 ) {
//--- アップロード処理 ---//
foreach( $b, $upListSub ) {
$$USER.DEFINED.9 = [$b, 1];
$path = str.join([$$DIR.STANDARD,
"AUTO\\SCRIPT\\SENDFILE.MX"], "" );
script.openExtern( $path, #FALSE, [] );
if( AUTO.getHaltFlg() != 0 ) {
return;
}
if( $$USER.DEFINED.9 == #TRUE ) {
AUTO.setSendFlg( $b );
}
$flg = 1;
}
}
if( $statusSub & 1 ) {
//--- ダウンロード処理 ---//
AUTO.sendCommand("SET PAGE ON");
//--- 読む文書の先頭番号を調べる ---//
$no = "";
$errFlg = 0;
$scanMode = -1;
AUTO.putStr("SCAN\r");
comtable( $b, 0 ) {
interval { AUTO.haltCheck(); }
"BBS>\w\w" { exit; } // 一覧表示終わり
">\w\w" { exit; } // 一覧表示終わり
$AUTO.WAIT60 { AUTO.putStr("\r"); }
"検索開始日 (" { $scanMode = 2; }
"検索キー (" { $scanMode = 3; }
"検索ID (" { $scanMode = 1; }
"検索 (" { $scanMode = 0; }
":\w\w" {
table( $scanMode ) {
else{ AUTO.putStr("\r"); $errFlg = 1; }
0 { AUTO.putStr2("1\r"); }
1 { AUTO.putStr2( str.join([$srhId, "\r"], "" )); }
3 { AUTO.putStr2( str.join([$srhKey,"\r"], "" )); }
2 {
if( $day1 == "000000" ) {
AUTO.putStr("\r");
} else {
AUTO.putStr2( str.join([$day1,"\r"], "" ));
}
}
}
}
"%b%b%d %3c%5d %b%d/%2d " {// 一覧の見出し部分
if( $no == "" ) {
if( str.mid( $b, 16, 5 ) != $ToDay1 ) {
$no = data.toString( data.toNumber( $b ));
}
}
}
"more>\w\w" { // 次頁あり
if( $no != "" ) {
exit;
}
AUTO.putStr("\r");
}
}
AUTO.putStr2("SET PAGE OFF\r");
AUTO.waitPrompt2( #TRUE );
if( $no != "" ) {
//--- 読む文書がある場合には、それを全部読む ---//
$cmd = str.join([$no, "-\r"], "" );
//$cmd = str.join([$no, "\r"], "" );
AUTO.putStr2( $cmd );
$ptrSub = file.tell( $LogId );
$ptr2 = $ptrSub;
comtable( $b, 0 ) {
interval { AUTO.haltCheck(); }
$AUTO.WAIT60 { AUTO.putStr("\r"); }
"\n" { // 行数加算
$ptrSub = file.tell( $LogId );
$ptr2 = $ptrSub;
}
"%b%b%d %3c%5d %b%d/%2d " {
if( file.tell( $LogId ) == $ptr2 + 23 ) {
$ptr = $ptrSub; // 見出し部分
$title = str.join([$b, str.replaceAll(
com.getString( 0, #TRUE, #TRUE ),
"\n", "" )], "" );
}
}
"next>\w\w" { // 次の文書がある
$tagList = data.copy( $tagSub );
$cnt = list.size( $tagList );
loop {
list.putLast( $tagList, -1 );
$cnt = $cnt + 1;
if( $cnt == 10 ) {
exit;
}
}
AUTO.writeIdx([
[0x501,[14,$tagList]],
[0x104,[$title]],
[0x303,[0x01,0x00,$ptr,$ptr2-$ptr,0,0,0]]] );
AUTO.putStr("\r");
}
">\w\w" { // 表示終了
$tagList = data.copy( $tagSub );
$cnt = list.size( $tagList );
loop {
list.putLast( $tagList, -1 );
$cnt = $cnt + 1;
if( $cnt == 10 ) {
exit;
}
}
AUTO.writeIdx([
[0x501,[14,$tagList]],
[0x104,[$title]],
[0x303,[0x01,0x00,$ptr,$ptr2-$ptr,0,0,0]]] );
// AUTO.putStr("\r");
// AUTO.sendCommand("E");
exit;
}
}
}
list.del1st( $a );
list.put1st( $a, #TRUE );
$flg = 2;
}
loop {
if( $flg == 0 ) {
exit;
}
AUTO.sendCommand("E");
$flg = $flg - 1;
}
}
Auto.updateBbsData( $dataList );
//--- データベースファイルをアップデートする必要が ---//
//--- 有るかどうか調べる ---//
//--- まずは削除するデータから ---//
$errMsg = [];
foreach( $a, $dataList ) {
if( data.getType( list.get1st( $a )) == #CONST ) {
continue;
}
if( data.getType( list.get1st( $a )) != #NUMBER ) {
continue;
}
$tagSub = list.putLast( data.copy( $tag ), list.get1st( $a ));
if( data.getType( list.getNth( $a, 3 )) == #LIST ) {
list.putLast( $tagSub, -2 );
}
if( trd.count( $TrdId, $tagSub ) != 0 ) {
trd.delData( $TrdId, $tagSub );
AUTO.setTrdUpdateFlg();
}
if( list.size( $errMsg ) == 0 ) {
$errMsg = ["掲示板のメニュー構成に変更がありました。",
"データベースファイルを更新しました。"];
AUTO.error("掲示板巡回", $errMsg );
}
}
//--- 追加するデータがあるかどうか ---//
$i = 1;
$j = 1;
foreach( $a, $chkList ) {
if( $a == 1 ) {
$i = $i + 1;
continue;
}
//--- 開いているTRDのIDを探す ---//
loop {
$tagSub = list.putLast( data.copy( $tag ), $j );
if( list.get1st( trd.checkList( $TrdId, $tagSub )) != 0 ) {
$j = $j + 1;
continue;
}
list.putLast( $tagSub, -2 );
if( list.get1st( trd.checkList( $TrdId, $tagSub )) != 0 ) {
$j = $j + 1;
continue;
}
exit;
}
list.delLast( $tagSub );
if( $flg == 1 ) {
AUTO.sendCommand("E");
AUTO.sendCommand("E");
}
if( Auto.makeBbsDataForDB( list.getNth( $noList, $i ),
list.getNth( $titleList, $i ),
$tagSub ) == #FALSE ) {
return( #FALSE );
}
AUTO.setTrdUpdateFlg();
$i = $i + 1;
if( list.size( $errMsg ) == 0 ) {
$errMsg = ["掲示板のメニュー構成に変更がありました。",
"データベースファイルを更新しました。"];
AUTO.error("掲示板巡回", $errMsg );
}
}
return( #TRUE );
}
//----------------------------------------------------------//
//--- データベースファイルと設定データとの連携を取る ---//
//----------------------------------------------------------//
function Auto.connectBbsData( $dataList, $tag ) {
$retStatus = #FALSE;
//--- 便宜上グループのデータから検索 ---//
$subList = [];
$tagSub = list.putLast( data.copy( $tag ), -5 );
list.putLast( $tagSub, -2 );
$groupCnt = 0;
loop {
$ret = trd.getData( $TrdId, $tagSub );
if( list.get1st( $ret ) == 0 ) {
exit;
}
$str = list.getNth( $ret, 2 );
$tagNo = list.getNth( list.getNth( $ret, 3 ), list.size( $tag ) + 1 );
$list = #FALSE;
$listCnt = 0;
foreach( $a, $dataList ) {
$listCnt = $listCnt + 1;
if( data.getType( list.getNth( $a, 3 )) != #LIST ) {
continue;
}
if( list.get1st( $a ) == $str ) {
$list = list.getNth( $a, 3 );
exit;
}
}
if( $list == #FALSE ) {
$listCnt = 0;
$list = [];
$a = [$str, #FALSE, $list];
list.putLast( $subList, $a );
}
trd.getDataPush( $TrdId );
$ret = Auto.connectBbsData($list,list.putLast(data.copy($tag),$tagNo));
trd.getDataPop( $TrdId );
if( $ret == #FALSE ) {
if( $listCnt == 0 ) {
list.delLast( $subList );
} else {
list.delNth( $dataList, $listCnt );
}
} else {
$st = list.get1st( $ret );
if( $st == #TRUE ) {
$retStatus = #TRUE;
}
list.delNth( $a, 2 );
list.putNth( $a, 1, $st );
list.put1st( $a, $tagNo );
$groupCnt = $groupCnt + 1;
}
$tagSub = [];
}
//--- 実データの検索 ---//
$tagSub = list.putLast( data.copy( $tag ), -6 );
$dataCnt = 0;
loop {
$ret = trd.getData( $TrdId, $tagSub );
if( list.get1st( $ret ) == 0 ) {
exit;
}
$dataCnt = $dataCnt + 1;
$str = list.getNth( $ret, 2 );
$tagNo = list.getNth( list.getNth( $ret, 3 ), list.size( $tag ) + 1 );
$list = #FALSE;
foreach( $a, $dataList ) {
if(( data.getType( list.getNth( $a, 1 )) != #STRING )||
( data.getType( list.getNth( $a, 3 )) == #LIST )) {
continue;
}
if( list.get1st( $a ) == $str ) {
if( list.getNth( $a, 4 ) >= $ToDay2 ) {
list.delNth( $a, 2 );
list.putNth( $a, 1, #FALSE );
}
if( list.getNth( $a, 2 ) == #TRUE ) {
$retStatus = #TRUE;
}
$list = $a;
exit;
}
}
if( $list == #FALSE ) {
list.putLast( $subList,[$tagNo,$str,#FALSE,"","000000","",-1] );
} else {
list.put1st( $a, $tagNo );
}
$tagSub = [];
}
if(( $groupCnt == 0 )&&( $dataCnt == 0 )) {
trd.setData( $TrdId, [1,5], "1" );
$delTag = list.putLast( data.copy( $tag ), -2 );
test.print( $delTag );
trd.delData( $TrdId, $delTag );
AUTO.setTrdUpdateFlg();
return( #FALSE );
}
//--- データ矛盾のチェックと後処理 ---//
$errMsg = [];
if( list.size( $subList ) != 0 ) {
if( list.size( $dataList ) != 0 ) {
$errMsg = ["設定とデータベースファイル間の情報が相違しています。",
"設定を再度行って下さい。",
"処理は引き続き続行します。"];
}
foreach( $a, $subList ) {
list.putLast( $dataList, $a );
}
} else {
foreach( $a, $dataList ) {
if( data.getType( list.get1st( $a )) != #NUMBER ) {
$errMsg =
["設定とデータベースファイル間の情報が相違しています。",
"設定を再度行って下さい。",
"処理は引き続き続行します。"];
exit;
}
}
}
if( list.size( $errMsg ) != 0 ) {
AUTO.error("掲示板巡回", $errMsg );
}
return([$retStatus, $dataList]);
}
//--------------------------------------------------------//
//--- 設定ファイルのBBSブロックの日付を更新する ---//
//--------------------------------------------------------//
function Auto.updateBbsData( $dataList ) {
$id = file.open( list.getNth( AUTO.getSetName(), 2 ), "", 1 );
foreach( $a, $dataList ) {
if( list.get1st( $a ) != #TRUE ) {
continue;
}
if( data.getType( list.getNth( $a, 6 )) == #LIST ) {
continue;
}
$ptr = list.getNth( $a, 9 );
if( $ptr != -1 ) {
file.seek( $id, $ptr, 0 );
file.putString( $id, $ToDay2 );
}
}
file.close( $id );
}
//--------------------------------//
//--- BBS情報の新規作成 ---//
//--------------------------------//
function Auto.makeBbsNew() {
trd.setData( $TrdId, [1,4,-2],"BBS\t掲示板" );
sys.stopIntRec();
loop {
AUTO.putStr("GO BBS\r");
$errFlg = 1;
comtable( $a, 300 ) {
"GO BBS\n" { $errFlg = 0; exit; }
interval { AUTO.haltCheck(); }
}
if( $errFlg == 0 ) {
exit;
}
AUTO.putStr("\r");
AUTO.waitPrompt( #TRUE );
continue;
}
$ret = Auto.getBbsMenu( 0 );
if( $ret == #FALSE ) {
//--- 掲示板に入れなかった ---//
trd.delData( $TrdId, [1,4,-2] );
return( #FALSE );
}
$titleList = list.getNth( $ret, 1 );
$noList = list.getNth( $ret, 2 );
$i = 1;
foreach( $a, $noList ) {
if( Auto.makeBbsDataForDB( $a, list.getNth($titleList, $i),
[1,4,$i] ) == #FALSE ) {
return( #FALSE );
}
AUTO.setTrdUpdateFlg();
$i = $i + 1;
}
sys.startIntRec();
return;
}
//----------------------------------------------------------//
//--- データベースファイルにBBSグループを作成する ---//
//----------------------------------------------------------//
function Auto.makeBbsDataForDB( $no, $title, $tag ) {
AUTO.putStr2( $no );
$ret = Auto.getBbsMenu( 1 );
if( $ret == #FALSE ) {
return( #FALSE );
}
$titleList = list.getNth( $ret, 1 );
$noList = list.getNth( $ret, 2 );
if( list.size( $noList ) == 0 ) {
//--- サブメニューが存在しない ---//
trd.setData( $TrdId, $tag, $title );
AUTO.sendCommand("E");
return( #TRUE );
}
//--- サブメニューが有る場合、サブグループの作成を行う ---//
trd.setData( $TrdId, list.putLast( data.copy( $tag ), -2 ), $title );
$i = 1;
foreach( $a, $noList ) {
if( Auto.makeBbsDataForDB( $a, list.getNth( $titleList, $i ),
list.putLast( data.copy( $tag ), $i )) == #FALSE ) {
return( #FALSE );
}
$i = $i + 1;
}
AUTO.sendCommand("E");
return;
}
//--------------------------------------//
//--- 掲示板のメニューを取得する ---//
//--------------------------------------//
function Auto.getBbsMenu( $mode ) {
$AUTO.WAIT15 = AUTO.getWaitChar( 15 );
$AUTO.WAIT60 = AUTO.getWaitChar( 60 );
$tmpList = [];
$inFlg = 0;
comtable( $a, 0 ) {
"現在、サービスは大変混雑しています。" {
AUTO.waitPrompt( #TRUE );
$errMsg = ["掲示板に入ることが出来ませんでした。",
"巡回を中断しました。"];
AUTO.error("掲示板巡回", $errMsg );
return( #FALSE );
}
interval { AUTO.haltCheck(); }
$AUTO.WAIT60 { AUTO.putStr("\r"); }
"BBS\n" { $inFlg = 1; }
">\w\w" { exit; }
">\w\w" { exit; }
"%b%d. " {
$str = str.replaceAll( com.getString( 0, #TRUE, #TRUE ), "\n", "");
$str = str.join([$a, $str], "" );
list.putLast( $tmpList, $str );
}
}
if(( $mode == 0 )&&( $inFlg == 0 )) {
//--- 掲示板に入れなかった ---//
$errMsg = ["掲示板に入ることが出来ませんでした。",
"巡回を中断しました。"];
AUTO.error("掲示板巡回", $errMsg );
return( #FALSE );
}
if( list.size( $tmpList ) == 0 ) {
//--- メニューが無い ---//
return( [[],[]] );
}
//--- メニューを一つずつに分解する ---//
$clm = str.match( list.get1st( $tmpList ), " 2. ", 0 );
$titleList = [];
$noList = [];
$i = 1;
foreach( $a, $tmpList ) {
if( str.length( $a ) < $clm + 1 ) {
$list = [$a];
} else {
$list = [str.left($a,$clm),str.right($a,str.length($a)-$clm)];
}
foreach( $b, $list ) {
list.putLast( $noList, str.join([
data.toString( data.toNumber( str.left( $b, 2 ))),"\r"],""));
list.putLast( $titleList,
str.replaceAll( str.mid( $b,4,str.length($b)-4 ), " ", "" ));
$i = $i + 1;
}
}
if( $mode == 0 ) {
list.del1st( $titleList );
list.del1st( $noList );
}
return( [$titleList,$noList] );
}